import java.util.*;
import java.util.function.*;

public class QQ {
	public static int count = 10001;
	private String nickName;
	private int account;


	public QQ (String name) {
		this.nickName = name;
		this.account = count++;
	}

	public void display() {
		System.out.println(this.nickName + "的注册号码为：" + account);
	}

	public static void main(String[] args) {
		// testMap();
		// testSave();
		// testGeneric();
		testSort();
	}

	public static void testSort() {
		Random rd = new Random();
		List<Integer> list = new ArrayList<>();
		for (int i = 0; i < 100; i++) {
			list.add(rd.nextInt(1000));
		}
		// 原地排序，会改变原集合的内容
		Collections.sort(list);
		// int sum = 0;
		// for (Integer tmp : list) {
		// 	System.out.println(tmp);
		// 	sum += tmp;
		// }
		// System.out.println(sum);
		/*int sum = list.stream().mapToInt(new ToIntFunction<Integer>() {
			public int applyAsInt(Integer value) {
				return value;
			}
		}).sum();*/
		// 将匿名内部类改成lambda表达式实现
		int sum = list.stream().mapToInt(e->e).sum();
		System.out.println(sum);
	}

	public static void testGeneric() {
		// java8新语法，new的类型不需要给出具体的泛型参数
		List<QQ> list = new ArrayList<>();
		// 用泛型约束元素类型之后，只允许合法的类型
		// list.add(1);
		// list.add("2");
		list.add(new QQ("qq"));
		list.add(new QQ("qq"));
		list.add(new QQ("qq"));
		list.add(new QQ("qq"));
		// 遍历或者取值的时候，不再需要向下转型
		for (QQ qq : list) {
			System.out.println(qq.account);
		}
	}

	public static void testSave() {
		List list = new ArrayList();
		list.add(1);
		list.add("2");
		list.add(new QQ("qq"));
		for (Object o : list) {
			// 强制类型转换之前做类型确认
			// 缺点：繁琐
			if (o instanceof QQ) {
				QQ tmp = (QQ)o;
				System.out.println(tmp.account);
			} else {
				System.out.println(o);
			}
		}
	}

	public static void testMap() {
		Map qqMap = new HashMap();

		for (int i = 1; i <= 15; i++) {
			QQ qq = new QQ(i + "号QQ");
			qq.display();
			// key=qq号，value=qq对象
			qqMap.put(qq.account, qq);
		}

		// 直接取某个qq号
		Object tmp = qqMap.get(10014);
		QQ qq = (QQ)tmp;
		System.out.println(qq.nickName);

		//遍历思路1：遍历key集合，依次取值
		/*Set keys = qqMap.keySet();
		for(Object key : keys) {
			QQ qq2 = (QQ)qqMap.get(key);
			System.out.println(qq2.nickName);
		}*/

		// 遍历思路2：直接遍历值集合
		/*Collection values = qqMap.values();
		for(Object value : values) {
			QQ qq3= (QQ)value;
		System.out.println(qq3.nickName);
		}*/

		// 遍历思路3:按实际存储对象（Map.Entry）遍历
		Set entrys = qqMap.entrySet();
		for (Object entry : entrys) {
			Map.Entry en = (Map.Entry)entry;
			QQ qq4 = (QQ)en.getValue();
			System.out.println(qq4.nickName);
		}
	}

	public static void testList() {
		// QQ[] allQQs = new QQ[15];
		// 构造一个初始容量为十的空列表。
		// ArrayList allQQs = new ArrayList();
		// 改成链表实现
		// LinkedList allQQs = new LinkedList();
		// 用多态的方式来实现
		// List allQQs = new ArrayList(); // 后面的对象创建用参数控制
		Set allQQs = new HashSet();

		for (int i = 1; i <= 15; i++) {
			QQ qq = new QQ(i + "号QQ");
			qq.display();
			// allQQs[i-1] = qq;
			// 将指定的元素追加到此列表的末尾。
			allQQs.add(qq);
		}
		allQQs.add(new QQ("我的qq"));

		// 注册之后还能使用吗？例如：显示第五个QQ的信息
		// System.out.println(i); // 超出作用域，无法访问
		// System.out.println(qq);
		// System.out.println(allQQs[4].nickName);
		// 返回此列表中指定位置的元素。
		// get方法返回的是Object类型
		// 向上转型：缺点是丢失子类的所有属性和方法
		// Set接口没有get方法，因为其是无序的
		// Object qq = allQQs.get(4);
		// 向下转型(强制类型转换)
		// QQ qq2 = (QQ)qq;
		// System.out.println(qq2.nickName);
		System.out.println("集合中的元素个数：" + allQQs.size());

		// 用迭代器遍历
		Iterator it = allQQs.iterator();
		while (it.hasNext()) {
			Object tmp = it.next();
			QQ qq  = (QQ)tmp;
			System.out.println(qq.nickName);
		}

		// 增强for循环（for-each)
		for (Object tmp :  allQQs) {
			QQ qq  = (QQ)tmp;
			System.out.println(qq.nickName);
		}
	}
}